/**
 * 版权所有(C)，上海勾芒信息科技，2017，所有权利保留。
 * 
 * 项目名：	cards-web
 * 文件名：	AdvancedInfo.java
 * 模块说明：	
 * 修改历史：
 * 2017年4月1日 - Debenson - 创建。
 */
package me.chanjar.weixin.mp.bean.card;

import java.io.Serializable;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * 卡券高级信息
 * 
 * @author Debenson
 * @since 0.1
 */
public class AdvancedInfo implements Serializable {
  private static final long serialVersionUID = 8790325402266591843L;

  /**
   * 使用门槛（条件）字段，若不填写使用条件则在券面拼写 ：无最低消费限制，全场通用，不限品类；并在使用说明显示： 可与其他优惠共享
   */
  @JsonProperty("use_condition")
  private UseCondition useCondition;

  /** 封面摘要 */
  @JsonProperty("abstract")
  private Abstract abstractContent;

  /**
   * 图文列表，显示在详情内页 ，优惠券券开发者须至少传入 一组图文列表
   */
  @JsonProperty("text_image_list")
  private List<TextImage> textImageList;

  /**
   * 商家服务类型： BIZ_SERVICE_DELIVER 外卖服务； BIZ_SERVICE_FREE_PARK 停车位；
   * BIZ_SERVICE_WITH_PET 可带宠物； BIZ_SERVICE_FREE_WIFI 免费wifi， 可多选
   */
  @JsonProperty("business_service")
  private List<BusinessServiceType> businessService;

  /** 使用时段限制 */
  @JsonProperty("time_limit")
  private List<TimeLimit> timeLimit;

  /** 是否支持分享给朋友使用，填写true优惠券才可被共享 */
  @JsonProperty("share_friends")
  private Boolean shareFriends;

  /**
   * 封面摘要
   * 
   * @return
   */
  public Abstract getAbstractContent() {
    return abstractContent;
  }

  public void setAbstractContent(Abstract abstractContent) {
    this.abstractContent = abstractContent;
  }

  /**
   * 图文列表，显示在详情内页 ，优惠券券开发者须至少传入 一组图文列表
   * 
   * @return
   */
  public List<TextImage> getTextImageList() {
    return textImageList;
  }

  public void setTextImageList(List<TextImage> textImageList) {
    this.textImageList = textImageList;
  }

  /**
   * 商家服务类型： BIZ_SERVICE_DELIVER 外卖服务； BIZ_SERVICE_FREE_PARK 停车位；
   * BIZ_SERVICE_WITH_PET 可带宠物； BIZ_SERVICE_FREE_WIFI 免费wifi， 可多选
   * 
   * @return
   */
  public List<BusinessServiceType> getBusinessService() {
    return businessService;
  }

  public void setBusinessService(List<BusinessServiceType> businessService) {
    this.businessService = businessService;
  }

  /**
   * 使用时段限制
   * 
   * @return
   */
  public List<TimeLimit> getTimeLimit() {
    return timeLimit;
  }

  public void setTimeLimit(List<TimeLimit> timeLimit) {
    this.timeLimit = timeLimit;
  }

  /**
   * 使用门槛（条件）字段，若不填写使用条件则在券面拼写 ：无最低消费限制，全场通用，不限品类；并在使用说明显示： 可与其他优惠共享
   * 
   * @return
   */
  public UseCondition getUseCondition() {
    return useCondition;
  }

  public void setUseCondition(UseCondition useCondition) {
    this.useCondition = useCondition;
  }

  /**
   * 使用门槛（条件）字段，若不填写使用条件则在券面拼写 ：无最低消费限制，全场通用，不限品类；并在使用说明显示： 可与其他优惠共享
   * 
   * @author Debenson
   * @since 0.1
   */
  public static class UseCondition implements Serializable {
    private static final long serialVersionUID = 3076165835306338896L;

    /**
     * 指定可用的商品类目，仅用于代金券类型 ，填入后将在券面拼写适用于xxx
     */
    @JsonProperty("accept_category")
    private String acceptCategory;

    /**
     * 指定不可用的商品类目，仅用于代金券类型 ，填入后将在券面拼写不适用于xxxx
     */
    @JsonProperty("reject_category")
    private String rejectCategory;

    /**
     * 满减门槛字段，可用于兑换券和代金券 ，填入后将在全面拼写消费满xx元可用。
     */
    @JsonProperty("least_cost")
    private Integer leastCost;

    /**
     * 购买xx可用类型门槛，仅用于兑换 ，填入后自动拼写购买xxx可用。
     */
    @JsonProperty("object_use_for")
    private String objectUseFor;

    /**
     * 不可以与其他类型共享门槛 ，填写false时系统将在使用须知里 拼写“不可与其他优惠共享”， 填写true时系统将在使用须知里
     * 拼写“可与其他优惠共享”， 默认为true
     */
    @JsonProperty("can_use_with_other_discount")
    private Boolean canUseWithOtherDiscount;

    /**
     * 指定可用的商品类目，仅用于代金券类型 ，填入后将在券面拼写适用于xxx
     * 
     * @return
     */
    public String getAcceptCategory() {
      return acceptCategory;
    }

    public void setAcceptCategory(String acceptCategory) {
      this.acceptCategory = acceptCategory;
    }

    /**
     * 指定不可用的商品类目，仅用于代金券类型 ，填入后将在券面拼写不适用于xxxx
     * 
     * @return
     */
    public String getRejectCategory() {
      return rejectCategory;
    }

    public void setRejectCategory(String rejectCategory) {
      this.rejectCategory = rejectCategory;
    }

    /**
     * 不可以与其他类型共享门槛 ，填写false时系统将在使用须知里 拼写“不可与其他优惠共享”， 填写true时系统将在使用须知里
     * 拼写“可与其他优惠共享”， 默认为true
     * 
     * @return
     */
    public Boolean getCanUseWithOtherDiscount() {
      return canUseWithOtherDiscount;
    }

    public void setCanUseWithOtherDiscount(Boolean canUseWithOtherDiscount) {
      this.canUseWithOtherDiscount = canUseWithOtherDiscount;
    }

    /**
     * 满减门槛字段，可用于兑换券和代金券 ，填入后将在全面拼写消费满xx元可用。
     * 
     * @return
     */
    public Integer getLeastCost() {
      return leastCost;
    }

    public void setLeastCost(Integer leastCost) {
      this.leastCost = leastCost;
    }

    /**
     * 购买xx可用类型门槛，仅用于兑换 ，填入后自动拼写购买xxx可用。
     * 
     * @return
     */
    public String getObjectUseFor() {
      return objectUseFor;
    }

    public void setObjectUseFor(String objectUseFor) {
      this.objectUseFor = objectUseFor;
    }

  }

  /**
   * 封面摘要结构体名称
   * 
   * @author Debenson
   * @since 0.1
   */
  public static class Abstract implements Serializable {
    private static final long serialVersionUID = -6342908264232125689L;

    /** 封面摘要简介。 */
    @JsonProperty("abstract")
    private String abstractContent;

    /**
     * 封面图片列表，仅支持填入一 个封面图片链接，上传图片接口 上传获取图片获得链接，填写 非CDN链接会报错，并在此填入。
     * 建议图片尺寸像素850*350
     */
    @JsonProperty("icon_url_list")
    private String iconUrlList;

    /**
     * 封面摘要简介
     * 
     * @return
     */
    public String getAbstractContent() {
      return abstractContent;
    }

    public void setAbstractContent(String abstractContent) {
      this.abstractContent = abstractContent;
    }

    /**
     * 封面图片列表，仅支持填入一 个封面图片链接，上传图片接口 上传获取图片获得链接，填写 非CDN链接会报错，并在此填入。
     * 建议图片尺寸像素850*350
     * 
     * @return
     */
    public String getIconUrlList() {
      return iconUrlList;
    }

    public void setIconUrlList(String iconUrlList) {
      this.iconUrlList = iconUrlList;
    }

  }

  /**
   * 图文列表，显示在详情内页
   * 
   * @author Debenson
   * @since 0.1
   */
  public static class TextImage implements Serializable {
    private static final long serialVersionUID = -4048327072156051235L;

    /**
     * 图片链接，必须调用上传图片接口 上传图片获得链接，并在此填入， 否则报错
     */
    @JsonProperty("image_url")
    private String image_url;

    /** 图文描述 */
    @JsonProperty("text")
    private String text;

    /**
     * 图片链接，必须调用上传图片接口 上传图片获得链接，并在此填入， 否则报错
     * 
     * @return
     */
    public String getImage_url() {
      return image_url;
    }

    public void setImage_url(String image_url) {
      this.image_url = image_url;
    }

    /**
     * 图文描述
     * 
     * @return
     */
    public String getText() {
      return text;
    }

    public void setText(String text) {
      this.text = text;
    }

  }

  /**
   * 商家服务类型
   * 
   * @author Debenson
   * @since 0.1
   */
  public static enum BusinessServiceType {

    /** 外卖服务 */
    BIZ_SERVICE_DELIVER,

    /** 停车位 */
    BIZ_SERVICE_FREE_PARK,

    /** 可带宠物 */
    BIZ_SERVICE_WITH_PET,

    /** 免费wifi */
    BIZ_SERVICE_FREE_WIFI
  }

  /**
   * 使用时段限制
   * 
   * @author Debenson
   * @since 0.1
   */
  public static class TimeLimit implements Serializable {
    private static final long serialVersionUID = 5405589122143352356L;

    /**
     * 限制类型枚举值：支持填入 MONDAY 周一 TUESDAY 周二 WEDNESDAY 周三 THURSDAY 周四 FRIDAY 周五
     * SATURDAY 周六 SUNDAY 周日 此处只控制显示， 不控制实际使用逻辑，不填默认不显示
     */
    @JsonProperty("type")
    private TimeLimitType type;

    /**
     * 当前type类型下的起始时间（小时） ，如当前结构体内填写了MONDAY， 此处填写了10，则此处表示周一 10:00可用
     */
    @JsonProperty("begin_hour")
    private Integer beginHour;

    /**
     * 当前type类型下的起始时间（分钟） ，如当前结构体内填写了MONDAY， begin_hour填写10，此处填写了59， 则此处表示周一
     * 10:59可用
     */
    @JsonProperty("begin_minute")
    private Integer beginMinute;

    /**
     * 当前type类型下的结束时间（小时） ，如当前结构体内填写了MONDAY， 此处填写了20，则此处表示周一 10:00-20:00可用
     */
    @JsonProperty("end_hour")
    private Integer endHour;

    /**
     * 当前type类型下的结束时间（分钟） ，如当前结构体内填写了MONDAY， begin_hour填写10，此处填写了59， 则此处表示周一
     * 10:59-00:59可用
     */
    @JsonProperty("end_minute")
    private Integer endMinute;

    /**
     * 限制类型枚举值：支持填入 MONDAY 周一 TUESDAY 周二 WEDNESDAY 周三 THURSDAY 周四 FRIDAY 周五
     * SATURDAY 周六 SUNDAY 周日 此处只控制显示， 不控制实际使用逻辑，不填默认不显示
     */
    public TimeLimitType getType() {
      return type;
    }

    public void setType(TimeLimitType type) {
      this.type = type;
    }

    /**
     * 当前type类型下的起始时间（小时） ，如当前结构体内填写了MONDAY， 此处填写了10，则此处表示周一 10:00可用
     */
    public Integer getBeginHour() {
      return beginHour;
    }

    public void setBeginHour(Integer beginHour) {
      this.beginHour = beginHour;
    }

    /**
     * 当前type类型下的起始时间（分钟） ，如当前结构体内填写了MONDAY， begin_hour填写10，此处填写了59， 则此处表示周一
     * 10:59可用
     */
    public Integer getBeginMinute() {
      return beginMinute;
    }

    public void setBeginMinute(Integer beginMinute) {
      this.beginMinute = beginMinute;
    }

    /**
     * 当前type类型下的结束时间（小时） ，如当前结构体内填写了MONDAY， 此处填写了20，则此处表示周一 10:00-20:00可用
     */
    public Integer getEndHour() {
      return endHour;
    }

    public void setEndHour(Integer endHour) {
      this.endHour = endHour;
    }

    /**
     * 当前type类型下的结束时间（分钟） ，如当前结构体内填写了MONDAY， begin_hour填写10，此处填写了59， 则此处表示周一
     * 10:59-00:59可用
     */
    public Integer getEndMinute() {
      return endMinute;
    }

    public void setEndMinute(Integer endMinute) {
      this.endMinute = endMinute;
    }

  }

  /**
   * 限制类型枚举值
   * 
   * @author Debenson
   * @since 0.1
   */
  public static enum TimeLimitType {

    /** 周一 */
    MONDAY,

    /** 周二 */
    TUESDAY,

    /** 周三 */
    WEDNESDAY,

    /** 周四 */
    THURSDAY,

    /** 周五 */
    FRIDAY,

    /** 周六 */
    SATURDAY,

    /** 周日 */
    SUNDAY

  }

}
